Tutoriel HsIndex

Tutoriel HsIndex 2 - Types de base

Les types de base

La première chose à définir sont les types de base

Les entrées du lexique

Le type est très simple. Il comprend une chaîne de caractères et une liste d'entiers représentant les numéros de pages. Une chaîne de caractères supplémentaire a pour rôle de donner à chaque entrée une équivalence de caractères pour le tri des noms dans l'index. Cette équivalence servira notamment à considérer les caractères accentués au même niveau que ceux qui ne le sont pas et à faire des conversions de certaines ligatures spécifiques à certaines langues (œ équivaudra aux caractères oe).

data IndexItem = 
        IndexItem { itemName       :: String
                  , itemEqui       :: (Section, String)
                  , itemPages      :: [Int]
                  , itemContent    :: [IndexSubItem]
                  }

Le type Section permet de définir le type de section auquel appartient cette entrée:

  • La section lettres.

  • La section chiffres.

  • La section symboles.

Il est nécessaire de dériver type dans la classe Eq afin de pouvoir utiliser les fonctions == et /= dans certaines fonctions.

data Section = Letters
             | Numbers
             | Symbols
             deriving (Eq)

Les entrées pourront également contenir des sous-entrées qui elles-mêmes peuvent contenir des sous-sous-entrés. Ceci permet d'être compatible pleinement avec le paquet imakeidx qui autorise ces sous entrées.

data IndexItem = 
        IndexItem { itemName       :: String
                  , itemEqui       :: (Section, String)
                  , itemPages      :: [Int]
                  , itemContent    :: [IndexSubItem]
                  }


data IndexSubItem = 
    IndexSubItem  { subItemName    :: String
                  , subItemEqui    :: (Section, String)
                  , subItemPages   :: [Int]
                  , subItemContent :: [IndexSubSubItem]
                  }

Les sections de lexique

Les sections contiennent les différents groupes d'entrées avec deux niveaux de groupements:

  • Le premier niveau regroupe les entrées par titres et les sous-sections associées.

  • Le second niveau regroupe les sous-sections par sous titres et les entrées

type Index = [IndexSection]

data IndexSection = 
    IndexSection  { secTitle       :: String
                  , secSubSections :: [IndexSubSection]
                  }


data IndexSubSection = 
  IndexSubSection { subSecTitle   :: String
                  , subSecEntries :: [IndexItem]
                  }

Le style

Ce type comprend plusieurs champs contenant les différentes chaînes de caractères pour décrire le style de l'index. Parmi ces champs on aura:

  • Le préambule de l'index (preamble).

  • La fin de l'index (postamble).

  • Les titres pour les sections symboles et chiffres.

  • Les commandes LaTeX.

  • Les différents délimiteurs.

data IndexStyle = 
  IndexStyle  { idxPreamble     :: String  -- ^ The preamble
              , idxPostamble    :: String  -- ^ The postamble
              , idxHeadingFlag0 :: Heading -- ^ The flag for the layer 0 heading, in connection with 'IndexSection's
              , idxHeadingFlag1 :: Heading -- ^ The flag for the layer 1 heading, in connection with 'IndexSubSection's
              , idxHeadingPreL0 :: String  -- ^ The prefix for the Layer 0 heading, in connection with 'IndexSection's
              , idxHeadingSufL0 :: String  -- ^ The suffix for the Layer 0 heading, in connection with 'IndexSection's
              , idxHeadingPreL1 :: String  -- ^ The prefix for the Layer 1 heading, in connection with 'IndexSubSection's
              , idxHeadingSufL1 :: String  -- ^ The suffix for the Layer 1 heading, in connection with 'IndexSubSection's
              , idxSymhead      :: String  -- ^ The title for the "symbols" section
              , idxNumhead      :: String  -- ^ The title for the "numbers" section
              , idxGroupSkip0   :: String  -- ^ The skip command after a layer 0 group ('IndexSection')
              , idxGroupSkip1   :: String  -- ^ The skip command after a layer 1 group ('IndexSubSection')
              , idxItem0        :: String  -- ^ The command to place before the index "items"
              , idxItem1        :: String  -- ^ The command to place before the index "subitems"
              , idxItem2        :: String  -- ^ The command to place before the index "subsubitems"
              , idxItem01       :: String  -- ^ The command to place between an index "items" and an index "subitems"
              , idxItem12       :: String  -- ^ The command to place between an index "subitems" and an index "subsubitems"
              , idxDelim0       :: String  -- ^ The delimiter between the name and the pages numbers for "items"
              , idxDelim1       :: String  -- ^ The delimiter between the name and the pages numbers for "subitems"
              , idxDelim2       :: String  -- ^ The delimiter between the name and the pages numbers for "subsubitems"
              , idxDelimn       :: String  -- ^ The delimiter bewteen pages numbers.
              }

Le type Heading permet de définir le type d'en tête de la section

  • Pas d'en-tête

  • En tête en majuscule.

  • En tête en minuscule.

Il est nécessaire de dériver type dans la classe Eq afin de pouvoir utiliser les fonctions == et /= dans certaines fonctions.

data Heading = None        -- ^ No heading
             | UpperCase   -- ^ Upper case heading
             | LowerCase   -- ^ Lower case heading
             deriving (Eq)

La définition de la langue

Ce type permet de décrire une langue en donnant la liste les caractères considérés comme des lettres, comme des chiffres et comme des symboles.

La liste de symboles peut être définie ou non d'où l'utilisation du type Maybe.

  • Dans le cas où une liste de symboles est définie, les éléments de cette liste sont considérés comme symboles. Les caractères qui ne sont ni dans la liste de lettres, ni dans la liste de chiffres ni dans la liste des symboles ne sont pas listés dans l'index.

  • Dans le cas où la liste des symboles n'est pas définie (Nothing), tous les caractères qui ne sont ni des lettres et ni des chiffres sont considérés comme des symboles et sont affichés.

data LangDef = LangDef  { lstLetters  :: String
                        , lstNumbers  :: String
                        , lstSymbols  :: Maybe String
                        , lstSubs     :: [CharSubs]
                        , lstSecOrder :: [Section]
                        }

Ce type contient également l'ordre de sections à afficher.

Voila pour les types principaux qui seront utilisés dans le programme.